概述
1.两种信息流:数据信息流,控制信息流$\left { \begin{aligned} 指令信息\状态信息\时序信息 \end{aligned} \right.$
2.五个部件:运算器,存储器,控制器,输入设备,输出设备
3.冯诺依曼体系结构计算机的特点:
硬件由五大部分组成运算器,控制器,存储器,输入设备,输出设备
软件以二进制表示
采用存储程序
所有的程序预先存放在存储器中
指令采用串行执行的方式
4.计算机系统的层次结构
graph BT;
数学模型,算法应用程序 --> 作为软件资源的应用程序 --> 语言处理程序 --> 操作系统级 --> 机器语言(指令系统) --> 微程序控制器,硬连逻辑部件
5.机器语言,汇编语言,高级语言
机器语言:二进制代码表示的机器语言,最底层,机器直接执行
汇编语言:一种需要助记符表示的与机器语言一一对应的语言,需要汇编后才能执行
高级语言:接近人类语言,与计算机结构无关,需要经过解释和编译
6.编译程序与解释程序最大区别在于:前者生成目标代码,后者不生成
7.汇编程序即汇编写的程序,与编译程序,...
1.linux文件权限一共10位长度
第一段指文件类型
第二段指拥有者所具有的权限
第三段指所属组的成员对于这个文件具有的权限
第四段指其他人对于这个文件有没有任何权限
2.shell是一种命令解释程序
3.>将标准输出信息写入一个新文件(重定向),>>将标准输出信息添加到一个已存在的文件中
4.ctrl+alt+F1:图形界面切换到文字终端界面
5.whereis -b [filename]:查找系统中指定文件名的二进制文件
6.free显示系统中已用资源和空闲资源,m参数以mb为单位显示系统中的资源,t显示系统中的资源并最后进行统计
7.关闭linux的命令:
halt:立刻关机
shutdown -h now:立刻关机(root)
poweroff:立刻关机
8.less显示文件内容时可以上下滚动而more不可以
9./proc/cpuinfo获得CPU的相关信息
10.grub可以引导windows操作系统.grub是引导装入器,负责装入内核并引导Linux系统,也可以引导其他操作系统.如果引导器不能很好的工作或者不具有弹性,那么很可...
Description
题目描述:忘了
附件内容:
from Crypto.Util.number import *
from random import *
from libnum import *
import gmpy2
from secret import x
flag = b'?????????'
m = bytes_to_long(flag)
def obfuscate(p, k):
nbit = p.bit_length()
while True:
l1 = [getRandomRange(-1, 1) for _ in '_' * k]
l2 = [getRandomRange(100, nbit) for _ in '_' * k]
l3 = [getRandomRange(10, nbit//4) for _ in '_' * k]
l4 = [getRandomRange(2, 6) for _ in '_' *k]
A = sum([l1[_] * 2 ** ...
前言
这题当时国赛的时候由于没有怎么碰过MISC,到最后一步没做出来,实在是难受,今天复盘了一下
Analyze
拿到题目附件是一个流量包,可以看到分别有2.4.0,2.3.0,2.2.0,2.10.0,2.8.1,2.8.0这些地址的USB流量,我们可以一个一个筛选出来,然后通过导出特定分组进行保存,用UsbKeyboardDataHacker来提取其中的信息,最终会发现2.10.1和2.8.1中有有效信息
这里展示一下2.8.1的提取过程
# usb.src=="2.8.1"||usb.dst=="2.8.1"
31 0.010805 2.8.1 host USB 35 URB_INTERRUPT in
32 0.010818 host 2.8.1 USB 27 URB_INTERRUPT in
33 0.110764 2.8.1 host USB 35 URB_INTERRUPT in
34 0.110777 host 2.8.1 USB 27 URB_INTERRUPT in
35 0.166...
通过file指令可以看到程序编译的链接状态,在知道程序可以通过ROP来打的情况下,根据statically linked和dynamically linked两种链接方式来构造对应的ropchain和对应不同的攻击思路
dynamically linked
如果程序是动态链接的话,泄露程序函数的真实地址后拿到libc基址去得到例如system和/bin/sh的地址,这里不再赘述
statically linked
如果程序是静态链接,相对与动态链接就没有那么麻烦了,有的程序我们可以通过ROPgadget这个工具来帮助我们构造我们的ropchain
ROPgadget --binary 程序名 --ropchain
Example-inndyrop
m1nus@ubuntu:~/elf/buu/inndy_rop$ file inndy_rop
inndy_rop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, Buil...
为什么需要stack pivoting
当stack overflow的空间不足时
怎么实现stack pivoting
通过将ebp覆盖成构造的fake_ebp,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上,从而实现栈的迁移
为什么是leave ret
leave:
mov esp , ebp;
pop ebp;
ret:
pop eip
实现过程
首先程序有stack overflow漏洞,我们将栈覆盖成下面的样子
执行完mov esp , ebp后
接着就是pop ebp,执行完后如图
由于esp是栈顶指针,当pop ebp后,栈顶的元素被弹给了ebp,所以esp应当向下移4个字节,也就是一个单位
下一步通过read()函数的ret来把内容输入到fake_ebp1地址上,这里主要是要将fake_ebp2的地址给到fake_ebp1的地址上
下一步就来到了leave_ret,也就是重复上方的mov esp,ebp pop ebp和pop eip
mov esp,ebp 后
接着pop ebp,由于fake_...